/**
  ******************************************************************************
  * @file    thread_pool.h
  * @author  杨启坤
  * @version V1.2.7
  * @date    2024.10
  * @brief   1、初始化线程池
  *          2、初始化任务链表
  *          
  ******************************************************************************
  * @attention
  *  注意：
  *     本文档只供学习使用，不得商用，违者必究
  *	 推广：
  *  	合作交流建议：FZetcSnitch@163.com
  *		网站建设推广：www.FZetc.com
  *  	微信公众号：  FZetc飞贼 
  *
  ******************************************************************************
  */

#ifndef __THREAD_POOL_H       // 定义以防止递归包含
#define __THREAD_POOL_H

// (1)、其它头文件
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
#include <pthread.h>

// (2)、宏定义(函数、变量、常量)
#define MAX_WAITING_TASKS 1000
#define MAX_ACTIVE_THREADS 20

// (3)、自定义类型(结构体、联合体、枚举)
// 1、任务链表结构体节点
struct task
{
	void *(*do_task)(void *arg);    // 指针函数指针，指向要执行任务
	void *arg;					            // 传递给任务函数的参数
	struct task *next;
};

// 2、线程池管理结构体 
typedef struct thread_pool
{
	pthread_mutex_t lock;           // 锁
	pthread_cond_t cond;            // 条件变量

	bool shutdown;                  // 关机标志(线程池)

	struct task *task_list;         // 任务链表(客户)

	pthread_t *tids;                // 线程id数组(纯数组会定死线程的数目大小，所以使用指针)

	unsigned max_waiting_tasks;     // 最大等待任务数(最多有多少个客户)
	unsigned waiting_tasks;         // 当前等待任务数(有多少个客户)
	unsigned active_threads;        // 活跃的线程数(一开始公司有多少个员工)
} thread_pool;

// (4)、函数声明
extern bool  THREAD_POOL_Init(thread_pool* pool, unsigned int threads_number);
extern void* THREAD_POOL_Routine(void *arg);
extern void  THREAD_POOL_Handler(void *arg);
extern bool  THREAD_POOL_AddTask(thread_pool *pool, void* (do_task)(void* arg), void *arg);
extern int   THREAD_POOL_AddThread(thread_pool *pool, unsigned int additional_threads);
extern int   THREAD_POOL_RemoveThread(thread_pool *pool, unsigned int removing_threads);
extern bool  THREAD_POOL_Destroy(thread_pool *pool);

// (5)、全局变量声明


// (6)、全局静态变量(定义)

// (7)、全局静态函数(实现)

#endif